import requests
import json
import time
import re
import datetime
import yaml
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
import plotly.graph_objects as go
import seaborn as sns
import matplotlib.pyplot as plt
def eda(data):
output=[]
for col in data.columns:
duplicatedvalue = data[col].duplicated().sum()
duplicatedrows = data.duplicated().sum()
missingvalue = np.sum(pd.isna(data[col]))
uniquevalue = data[col].nunique()
datatype = str(data[col].dtype)
output.append([col, duplicatedvalue, duplicatedrows, missingvalue, uniquevalue, datatype])
output = pd.DataFrame(output)
output.columns = ['Features', 'Duplicated Values', 'Duplicated Rows', 'Missing Values', 'Unique Values', 'Data Type']
display(output)
def perc_on_bar(plot, feature):
total = len(feature)
for p in ax.patches:
percentage = "{:.1f}%".format(100 * p.get_height() / total)
x = p.get_x() + p.get_width() / 2 - 0.05
y = p.get_y() + p.get_height()
ax.annotate(percentage, (x, y), size=12)
plt.show()
with open ('config.yml') as ymlfile:
cfg = yaml.safe_load(ymlfile)
oanda_api_key = cfg['creds']['oanda_api']
provider_authorization = 'Bearer {0}'.format(oanda_api_key)
headers = {
'Content-Type': 'application/json',
'Authorization': provider_authorization,
}
params_D = (
('price', 'BA'),
('from', '2016-10-17T15:00:00.000000000Z'),
('granularity', 'D'),
)
params_4H = (
('price', 'BA'),
('count', '5000'),
('granularity', 'H4'),
)
response = requests.get('https://api-fxpractice.oanda.com/v3/instruments/EUR_USD/candles',
headers=headers,
params=params_4H).json()
output = []
all_candlesticks = response['candles']
for i in range (len(all_candlesticks)):
output.append([response['candles'][i]['time'],
response['candles'][i]['volume'],
response['candles'][i]['bid']['o'],
response['candles'][i]['bid']['h'],
response['candles'][i]['bid']['l'],
response['candles'][i]['bid']['c']])
output = pd.DataFrame(output)
output.columns = ['Date', 'Volume', 'Open', 'High', 'Low', 'Close']
eurusd_data = output.to_csv('EURUSD_4H.csv', header = True, index = False)
eurusd_data = pd.read_csv('EURUSD_4H.csv')
eurusd_data.shape
(5000, 6)
eurusd_data
| Date | Volume | Open | High | Low | Close | |
|---|---|---|---|---|---|---|
| 0 | 2018-06-04T17:00:00.000000000Z | 4014 | 1.16852 | 1.17016 | 1.16848 | 1.16956 |
| 1 | 2018-06-04T21:00:00.000000000Z | 4032 | 1.16939 | 1.17029 | 1.16901 | 1.16930 |
| 2 | 2018-06-05T01:00:00.000000000Z | 3802 | 1.16928 | 1.16968 | 1.16853 | 1.16865 |
| 3 | 2018-06-05T05:00:00.000000000Z | 12695 | 1.16862 | 1.17162 | 1.16825 | 1.17039 |
| 4 | 2018-06-05T09:00:00.000000000Z | 13544 | 1.17034 | 1.17058 | 1.16615 | 1.16657 |
| ... | ... | ... | ... | ... | ... | ... |
| 4995 | 2021-08-20T01:00:00.000000000Z | 5024 | 1.16814 | 1.16869 | 1.16751 | 1.16853 |
| 4996 | 2021-08-20T05:00:00.000000000Z | 15320 | 1.16851 | 1.16886 | 1.16701 | 1.16734 |
| 4997 | 2021-08-20T09:00:00.000000000Z | 13877 | 1.16733 | 1.16828 | 1.16643 | 1.16678 |
| 4998 | 2021-08-20T13:00:00.000000000Z | 23033 | 1.16676 | 1.17039 | 1.16634 | 1.17026 |
| 4999 | 2021-08-20T17:00:00.000000000Z | 6450 | 1.17024 | 1.17039 | 1.16915 | 1.16981 |
5000 rows × 6 columns
fig = go.Figure(data=[go.Candlestick(x=eurusd_data['Date'],
open=eurusd_data['Open'],
high=eurusd_data['Close'],
low=eurusd_data['Low'],
close=eurusd_data['Close'])])
fig.show()
eurusd_data['O-H'] = eurusd_data['Open'] - eurusd_data['High']
eurusd_data['O-L'] = eurusd_data['Open'] - eurusd_data['Low']
eurusd_data['O-C'] = eurusd_data['Open'] - eurusd_data['Close']
eurusd_data['H-L'] = eurusd_data['High'] - eurusd_data['Low']
eurusd_data['H-C'] = eurusd_data['High'] - eurusd_data['Close']
eurusd_data['L-C'] = eurusd_data['Low'] - eurusd_data['Close']
eurusd_data.head()
| Date | Volume | Open | High | Low | Close | O-H | O-L | O-C | H-L | H-C | L-C | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2018-06-04T17:00:00.000000000Z | 4014 | 1.16852 | 1.17016 | 1.16848 | 1.16956 | -0.00164 | 0.00004 | -0.00104 | 0.00168 | 0.00060 | -0.00108 |
| 1 | 2018-06-04T21:00:00.000000000Z | 4032 | 1.16939 | 1.17029 | 1.16901 | 1.16930 | -0.00090 | 0.00038 | 0.00009 | 0.00128 | 0.00099 | -0.00029 |
| 2 | 2018-06-05T01:00:00.000000000Z | 3802 | 1.16928 | 1.16968 | 1.16853 | 1.16865 | -0.00040 | 0.00075 | 0.00063 | 0.00115 | 0.00103 | -0.00012 |
| 3 | 2018-06-05T05:00:00.000000000Z | 12695 | 1.16862 | 1.17162 | 1.16825 | 1.17039 | -0.00300 | 0.00037 | -0.00177 | 0.00337 | 0.00123 | -0.00214 |
| 4 | 2018-06-05T09:00:00.000000000Z | 13544 | 1.17034 | 1.17058 | 1.16615 | 1.16657 | -0.00024 | 0.00419 | 0.00377 | 0.00443 | 0.00401 | -0.00042 |
eurusd_data['Direction'] = eurusd_data['O-C'].apply(lambda x: 'UP' if x<0 else 'DOWN')
eurusd_data.tail(25)
| Date | Volume | Open | High | Low | Close | O-H | O-L | O-C | H-L | H-C | L-C | Direction | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 4975 | 2021-08-16T17:00:00.000000000Z | 5151 | 1.17747 | 1.17789 | 1.17738 | 1.17755 | -0.00042 | 0.00009 | -0.00008 | 0.00051 | 0.00034 | -0.00017 | UP |
| 4976 | 2021-08-16T21:00:00.000000000Z | 2349 | 1.17764 | 1.17797 | 1.17696 | 1.17733 | -0.00033 | 0.00068 | 0.00031 | 0.00101 | 0.00064 | -0.00037 | DOWN |
| 4977 | 2021-08-17T01:00:00.000000000Z | 6649 | 1.17731 | 1.17761 | 1.17662 | 1.17679 | -0.00030 | 0.00069 | 0.00052 | 0.00099 | 0.00082 | -0.00017 | DOWN |
| 4978 | 2021-08-17T05:00:00.000000000Z | 20223 | 1.17680 | 1.17843 | 1.17596 | 1.17767 | -0.00163 | 0.00084 | -0.00087 | 0.00247 | 0.00076 | -0.00171 | UP |
| 4979 | 2021-08-17T09:00:00.000000000Z | 21457 | 1.17768 | 1.17770 | 1.17406 | 1.17435 | -0.00002 | 0.00362 | 0.00333 | 0.00364 | 0.00335 | -0.00029 | DOWN |
| 4980 | 2021-08-17T13:00:00.000000000Z | 26862 | 1.17434 | 1.17442 | 1.17079 | 1.17081 | -0.00008 | 0.00355 | 0.00353 | 0.00363 | 0.00361 | -0.00002 | DOWN |
| 4981 | 2021-08-17T17:00:00.000000000Z | 9874 | 1.17079 | 1.17192 | 1.17072 | 1.17078 | -0.00113 | 0.00007 | 0.00001 | 0.00120 | 0.00114 | -0.00006 | DOWN |
| 4982 | 2021-08-17T21:00:00.000000000Z | 3548 | 1.17093 | 1.17128 | 1.17013 | 1.17115 | -0.00035 | 0.00080 | -0.00022 | 0.00115 | 0.00013 | -0.00102 | UP |
| 4983 | 2021-08-18T01:00:00.000000000Z | 6521 | 1.17114 | 1.17224 | 1.17094 | 1.17177 | -0.00110 | 0.00020 | -0.00063 | 0.00130 | 0.00047 | -0.00083 | UP |
| 4984 | 2021-08-18T05:00:00.000000000Z | 12408 | 1.17176 | 1.17291 | 1.17120 | 1.17196 | -0.00115 | 0.00056 | -0.00020 | 0.00171 | 0.00095 | -0.00076 | UP |
| 4985 | 2021-08-18T09:00:00.000000000Z | 16056 | 1.17197 | 1.17256 | 1.17053 | 1.17171 | -0.00059 | 0.00144 | 0.00026 | 0.00203 | 0.00085 | -0.00118 | DOWN |
| 4986 | 2021-08-18T13:00:00.000000000Z | 21810 | 1.17173 | 1.17206 | 1.16929 | 1.16987 | -0.00033 | 0.00244 | 0.00186 | 0.00277 | 0.00219 | -0.00058 | DOWN |
| 4987 | 2021-08-18T17:00:00.000000000Z | 24450 | 1.16988 | 1.17417 | 1.16973 | 1.17075 | -0.00429 | 0.00015 | -0.00087 | 0.00444 | 0.00342 | -0.00102 | UP |
| 4988 | 2021-08-18T21:00:00.000000000Z | 4977 | 1.17073 | 1.17150 | 1.16833 | 1.16868 | -0.00077 | 0.00240 | 0.00205 | 0.00317 | 0.00282 | -0.00035 | DOWN |
| 4989 | 2021-08-19T01:00:00.000000000Z | 9878 | 1.16870 | 1.16930 | 1.16648 | 1.16763 | -0.00060 | 0.00222 | 0.00107 | 0.00282 | 0.00167 | -0.00115 | DOWN |
| 4990 | 2021-08-19T05:00:00.000000000Z | 25661 | 1.16761 | 1.16966 | 1.16682 | 1.16862 | -0.00205 | 0.00079 | -0.00101 | 0.00284 | 0.00104 | -0.00180 | UP |
| 4991 | 2021-08-19T09:00:00.000000000Z | 20884 | 1.16863 | 1.17036 | 1.16795 | 1.16981 | -0.00173 | 0.00068 | -0.00118 | 0.00241 | 0.00055 | -0.00186 | UP |
| 4992 | 2021-08-19T13:00:00.000000000Z | 26254 | 1.16980 | 1.17019 | 1.16782 | 1.16877 | -0.00039 | 0.00198 | 0.00103 | 0.00237 | 0.00142 | -0.00095 | DOWN |
| 4993 | 2021-08-19T17:00:00.000000000Z | 9181 | 1.16878 | 1.16879 | 1.16719 | 1.16755 | -0.00001 | 0.00159 | 0.00123 | 0.00160 | 0.00124 | -0.00036 | DOWN |
| 4994 | 2021-08-19T21:00:00.000000000Z | 1958 | 1.16755 | 1.16832 | 1.16745 | 1.16816 | -0.00077 | 0.00010 | -0.00061 | 0.00087 | 0.00016 | -0.00071 | UP |
| 4995 | 2021-08-20T01:00:00.000000000Z | 5024 | 1.16814 | 1.16869 | 1.16751 | 1.16853 | -0.00055 | 0.00063 | -0.00039 | 0.00118 | 0.00016 | -0.00102 | UP |
| 4996 | 2021-08-20T05:00:00.000000000Z | 15320 | 1.16851 | 1.16886 | 1.16701 | 1.16734 | -0.00035 | 0.00150 | 0.00117 | 0.00185 | 0.00152 | -0.00033 | DOWN |
| 4997 | 2021-08-20T09:00:00.000000000Z | 13877 | 1.16733 | 1.16828 | 1.16643 | 1.16678 | -0.00095 | 0.00090 | 0.00055 | 0.00185 | 0.00150 | -0.00035 | DOWN |
| 4998 | 2021-08-20T13:00:00.000000000Z | 23033 | 1.16676 | 1.17039 | 1.16634 | 1.17026 | -0.00363 | 0.00042 | -0.00350 | 0.00405 | 0.00013 | -0.00392 | UP |
| 4999 | 2021-08-20T17:00:00.000000000Z | 6450 | 1.17024 | 1.17039 | 1.16915 | 1.16981 | -0.00015 | 0.00109 | 0.00043 | 0.00124 | 0.00058 | -0.00066 | DOWN |
eda (eurusd_data)
| Features | Duplicated Values | Duplicated Rows | Missing Values | Unique Values | Data Type | |
|---|---|---|---|---|---|---|
| 0 | Date | 0 | 0 | 0 | 5000 | object |
| 1 | Volume | 608 | 0 | 0 | 4392 | int64 |
| 2 | Open | 883 | 0 | 0 | 4117 | float64 |
| 3 | High | 865 | 0 | 0 | 4135 | float64 |
| 4 | Low | 878 | 0 | 0 | 4122 | float64 |
| 5 | Close | 857 | 0 | 0 | 4143 | float64 |
| 6 | O-H | 3977 | 0 | 0 | 1023 | float64 |
| 7 | O-L | 3992 | 0 | 0 | 1008 | float64 |
| 8 | O-C | 3447 | 0 | 0 | 1553 | float64 |
| 9 | H-L | 3689 | 0 | 0 | 1311 | float64 |
| 10 | H-C | 3968 | 0 | 0 | 1032 | float64 |
| 11 | L-C | 4003 | 0 | 0 | 997 | float64 |
| 12 | Direction | 4998 | 0 | 0 | 2 | object |
plt.figure(figsize=(20,10))
plt.xticks(rotation = 90)
ax = sns.countplot(eurusd_data['Direction'].tail(cc), order=eurusd_data['Direction'].tail(cc).value_counts().index)
perc_on_bar(ax, eurusd_data['Direction'].tail(cc))
cc = 90 #candlestick count
fig = go.Figure(data=[go.Candlestick(x=eurusd_data['Date'].tail(cc),
open=eurusd_data['Open'].tail(cc),
high=eurusd_data['Close'].tail(cc),
low=eurusd_data['Low'].tail(cc),
close=eurusd_data['Close'].tail(cc))])
fig.update_layout(xaxis_rangeslider_visible=False)
fig.show()